package com.example.springbootproject.service.impl;/*
 *@author 王志威
 *@datatime 2024/4/14 15:34
 *@editnote
 */

import com.example.springbootproject.mapper.LoginMapper;
import com.example.springbootproject.pojo.Admin;
import com.example.springbootproject.service.LoginService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.xml.bind.annotation.adapters.HexBinaryAdapter;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

@Service
@Slf4j
public class LoginServiceImpl implements LoginService {
    @Autowired
    private LoginMapper loginMapper;

    /**
     * 登录功能实现。
     * 通过用户名和密码参数验证用户登录状态。
     *
     * @param username 用户名，不可为null。
     * @param encryptedPassword 密码，不可为null。
     * @return Admin 返回登录成功的用户对象；如果登录失败，返回null。
     */
    @Override
    public Admin login(String username, String encryptedPassword) throws NoSuchAlgorithmException {

        //检验与数据库的加密之后的密码是否一致

        Admin admin =loginMapper.getSaltAndEncryptedPassword(username);
        if (admin == null) {
            log.info("用户名不存在");
            return null;
        }
        //向数据库取对应用户的盐
        String salt = admin.getSalt();
        //向数据库取对应用户的加密之后的密码
        //创建SHA-256加密对象
        MessageDigest messageDigest = MessageDigest.getInstance("SHA-256");
        //加盐加密
        messageDigest.update((encryptedPassword + salt).getBytes());
        //计算哈希值
        byte[] result = messageDigest.digest();
        //转换为十六进制字符串
        String encryptedPasswordAfter = new HexBinaryAdapter().marshal(result);
        encryptedPasswordAfter=encryptedPasswordAfter.toLowerCase();
        log.info("加密之后的密码为：" + encryptedPasswordAfter);
        //用户输入的密码和数据库中加密之后的密码进行比较
            //1.向数据库中查询用户名对应的加密之后的密码
        if (!encryptedPasswordAfter.equals(admin.getEncryptedPassword())) {
            log.info("密码错误");
            return null;
        }
        return loginMapper.login(username, encryptedPasswordAfter);
    }
}
